package com.znxs.zuopao_c.service;

import com.znxs.zuopao_c.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @author znxs
*  针对表【user】的数据库操作Service
* &#064;createTime  2023-08-30 15:19:35
 */
public interface UserService extends IService<User> {

    /**
     * 用户登录功能
     * @param userAccount 用户账户
     * @param userPassword 用户密码
     * @param checkedPassword 检查密码
     * @return 用户id
     */
    long userRegister(String userAccount,String userPassword,String checkedPassword,String plantCode);

    /**
     *  用户登录 （脱敏）
     * @param userAccount 用户账户
     * @param userPassword 用户密码
     * @return 用户脱敏信息
     */
    User userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 用户脱敏
     *
     * @param oldUser 没有脱敏的用户
     * @return 脱敏后的用户
     */
    User getSafetyUser(User oldUser);

    /**
     * 退出登录
     *
     * @param request http 请求参数
     * @author znxs
     */
    void outLogin(HttpServletRequest request);

    /**
     * 根据标签查找用户
     * @param tagNamesList 词条数据列表
     * @return 查询的用户列表
     */
    List<User> searchUserByTags(List<String> tagNamesList);

    /**
     * 修改用户信息
     * 如果是管理员就可以修改所有用户的信息
     * 如果不是管理员就只能修改自己的信息
     * @param user 要修改的用户信息
     * @param userLogin 登录的用户信息
     * @return 修改结果
     *
     * @author znxs
     */
    Boolean updateUser(User user,User userLogin);

    /**
     * 获取当前登录用户信息
     * @param request 请求参数
     * @return 用户信息
     * @author znxs
     */
    User getLoginUser(HttpServletRequest request);



    /**
     * 鉴权
     *
     * @param request http请求参数
     * @return 是否为管理员
     */
    Boolean isAdmin(HttpServletRequest request);


    /**
     * 鉴权
     *
     * @param userLogin 登录用户
     * @return 是否为管理员
     */
    Boolean isAdmin(User userLogin);

    /**
     * 判断用户是否登录
     * @param request http 请求参数
     * @return 登录用户
     */
    User isLogin(HttpServletRequest request);

    @Deprecated
    List<User> searchUserByTagsBefore(List<String> tagNamesList);

    /**
     * 推荐算法 推荐用户相似度最高的用户
     * @param num 个数
     * @param loginUser 当前登录用户
     * @return 用户列表
     */
    List<User> matchUsers(long num, User loginUser);

    /**
     * 做缓存 如果用户登录，就根据用户登录做缓存，如果没登录，就根据系统配置做缓存
     * @param redisKey 缓存模板
     * @param cacheData 缓存数据
     * @return 是否有缓存
     * @param <T> 数据类型
     */
    <T> boolean doCache(String redisKey, T cacheData);

}
